/* 
 * File:   ifthenelse.cpp
 * Author: Henrique
 * 
 * Created on 22 de Abril de 2010, 15:04
 */

#include <vector>
#include <string>

#include "ifthenelse.h"
#include "atribuicao.h"
#include "Interpretador.h"

ifthenelse::ifthenelse() {
}

ifthenelse::ifthenelse(const ifthenelse& orig) {
}

ifthenelse::ifthenelse(std::string str, std::vector<std::string> comandos, double* mem) {
    memoria = mem;
    int co = 0;
    int pilha = 1;
    std::string sTemp;
    for (int i = 2; i < str.size() - 5; i++) {
        char c = str.at(i);
        if (c != ' ') {
            sTemp.append(1, c);
        }
    }
    condicional = sTemp;

    for (int i = 0; i < comandos.size(); i++) {
        std::string teste = comandos.at(i);
        teste.erase(teste.size() - 1, 1);
        if (teste.compare(str) == 0) {
            co = 1;
        }
        int ifi = 0;

        if (co == 1) {
            if (ifi == 0) {
                if (comandos.at(i).find("else", 0)) {
                    std::cout << comandos.at(i);
                    comandoif.push_back(comandos.at(i));

                    if (comandos.at(i).find("if") == 0 && !(comandos.at(i).compare("endif") == 0)) {
                        pilha++;
                    } else
                        if (comandos.at(i).find("endif") == 0) {
                        pilha--;
                    }
                    if (pilha == 0)
                        break;
                } else
                    ifi = 1; std::cout << comandos.at(i);
            }
            if (ifi == 1) {
                comandoelse.push_back(comandos.at(i));
                if (comandos.at(i).find("if") == 0 && !(comandos.at(i).compare("endif") == 0)) {
                    pilha++;
                } else
                    if (comandos.at(i).find("endif") == 0) {
                    pilha--;
                }
                if (pilha == 0)

                    break;
            }
        }
    }
}

ifthenelse::~ifthenelse() {
}

double* ifthenelse::execute() {

    atribuicao *atrib = new atribuicao(' ', memoria);
    if (atrib->processamentoAtribuicao(condicional) == (1 || true)) {
        Interpretador *inter = new Interpretador();
        memoria = inter->execute(comandoif, memoria);
    } else {
        Interpretador *inter = new Interpretador();
        memoria = inter->execute(comandoelse, memoria);
    }
    return memoria;
}